package JoReg

type Nfa struct {
	// 向上的节点和回旋的节点
	upPtr *Nfa
	// 向下胡节点
	nextPtr *Nfa
	// NFA边集合
	edgeSet map[byte]struct{}
	// 状态节点索引值
	stateIndex int
	// 节点是否被访问过，用于节点打印
	visited bool
}

const ASCII_COUNT = 127

func MakeNfa(nfaManagerPtr *NfaManager) *Nfa {
	edgeSet := make(map[byte]struct{})
	nfaPtr := &Nfa{
		upPtr:   nil,
		nextPtr: nil,
		// set为空 -> 空边
		edgeSet:    edgeSet,
		stateIndex: nfaManagerPtr.stateIndex,
	}
	nfaManagerPtr.stateIndex++
	return nfaPtr
}

// 单个字符
func (this *Nfa) putEdge(char byte) {
	this.edgeSet[char] = struct{}{}
}

// 数字(0-9)
func (this *Nfa) putNumberEdge() {
	for i := byte(48); i <= 57; i++ {
		this.putEdge(i)
	}
}

// putLowerEdge 小写字母
func (this *Nfa) putLowerEdge() {
	for i := byte(97); i <= 122; i++ {
		this.putEdge(i)
	}
}

// putUpperEdge 大写字母
func (this *Nfa) putUpperEdge() {
	for i := byte(65); i <= 90; i++ {
		this.putEdge(i)
	}
}

// putBlankCharEdge 空白字符
func (this *Nfa) putBlankCharEdge() {
	this.putEdge(' ')
	this.putEdge('\r')
	this.putEdge('\n')
	this.putEdge('\t')
	this.putEdge('\v')
	this.putEdge('\f')
}

// Complement 补足
func (this *Nfa) Complement() {
	newSet := make(map[byte]struct{})
	for i := byte(0); i < ASCII_COUNT; i++ {
		if _, ok := this.edgeSet[uint8(i)]; !ok {
			newSet[i] = struct{}{}
		}
	}
	this.edgeSet = newSet
}
